import axios from 'axios'
import Cookies from 'js-cookie'

const baseUrl = ['http://localhost:8081/api']
// const baseUrl = ['http://192.168.0.107:8081/api']

// api 请求列表
const list = {
  /**
   * 菜单管理
   */
  // 菜单列表
  getMenuList: { method: 'get', url: baseUrl[0] + '/menu/list' },
  // 新增菜单
  addMenu: { method: 'post', url: baseUrl[0] + '/menu/add' },
  // 修改菜单
  updateMenu: { method: 'put', url: baseUrl[0] + '/menu/update' },
  // 删除菜单
  deleteMenu: { method: 'delete', url: baseUrl[0] + '/menu/deleteById' },
  // 菜单详情
  detailMenu: { method: 'get', url: baseUrl[0] + '/menu/detail' },
  /**
   * 接口管理
   */
  // 接口列表
  getApiList: { method: 'get', url: baseUrl[0] + '/perm/list' },
  // 新增接口
  addApi: { method: 'post', url: baseUrl[0] + '/perm/add' },
  // 修改接口
  updateApi: { method: 'put', url: baseUrl[0] + '/perm/update' },
  // 删除接口
  deleteApi: { method: 'delete', url: baseUrl[0] + '/perm/deleteById' },
  // 接口详情
  detailApi: { method: 'get', url: baseUrl[0] + '/perm/detail' },
  // 查询不重复的tag列表
  getApiTagList: { method: 'get', url: baseUrl[0] + '/perm/tagList' },
  // 查询模块下的接口列表
  getTagApiList: { method: 'post', url: baseUrl[0] + '/perm/tagPermList' },
  /**
   * 角色管理
   */
  // 角色列表
  getRoleList: { method: 'get', url: baseUrl[0] + '/role/list' },
  // 新增角色
  addRole: { method: 'post', url: baseUrl[0] + '/role/add' },
  // 修改角色
  updateRole: { method: 'put', url: baseUrl[0] + '/role/update' },
  // 删除角色
  deleteRole: { method: 'delete', url: baseUrl[0] + '/role/deleteById' },
  // 角色详情
  detailRole: { method: 'get', url: baseUrl[0] + '/role/detail' },
  // 角色新增/修改菜单授权
  setRoleMenu: { method: 'post', url: baseUrl[0] + '/role/setRoleMenu' },
  // 角色新增/修改接口授权
  setRolePerm: { method: 'post', url: baseUrl[0] + '/role/setRolePerm' },
  /**
   * 用户管理
   */
  // 注册
  register: { method: 'post', url: baseUrl[0] + '/user/registr' },
  // 登录
  login: { method: 'post', url: baseUrl[0] + '/user/login' },
  // 用户列表
  getUserList: { method: 'get', url: baseUrl[0] + '/user/list' },
  // 新增用户
  addUser: { method: 'post', url: baseUrl[0] + '/user/add' },
  // 修改用户
  updateUser: { method: 'put', url: baseUrl[0] + '/user/update' },
  // 删除用户
  deleteUser: { method: 'delete', url: baseUrl[0] + '/user/deleteById' },
  // 用户详情
  detailUser: { method: 'get', url: baseUrl[0] + '/user/detail' },
  // 修改用户头像
  updateAvatar: { method: 'post', url: baseUrl[0] + '/user/updateImg' },
  // 重置密码
  resetPwd: { method: 'post', url: baseUrl[0] + '/user/resetPwd' },
  // 验证输入密码与原密码
  pwdIseq: { method: 'post', url: baseUrl[0] + '/user/pwdIseq' },
  // 查询用户角色下路由菜单
  getUserMenu: { method: 'get', url: baseUrl[0] + '/user/getMenu' },
  /**
   * 收藏管理
   */
  // 收藏列表
  getCollectList: { method: 'get', url: baseUrl[0] + '/collect/list' },
  // 新增收藏
  addCollect: { method: 'post', url: baseUrl[0] + '/collect/add' },
  // 修改收藏
  updateCollect: { method: 'put', url: baseUrl[0] + '/collect/update' },
  // 删除收藏
  deleteCollect: { method: 'delete', url: baseUrl[0] + '/collect/deleteById' },
  // 收藏详情
  detailCollect: { method: 'get', url: baseUrl[0] + '/collect/detail' },
  /**
   * 收藏类别管理
   */
  // 收藏类别列表
  getCollectTypeList: { method: 'get', url: baseUrl[0] + '/collectType/list' },
  // 新增收藏类别
  addCollectType: { method: 'post', url: baseUrl[0] + '/collectType/add' },
  // 修改收藏类别
  updateCollectType: { method: 'put', url: baseUrl[0] + '/collectType/update' },
  // 删除收藏类别
  deleteCollectType: { method: 'delete', url: baseUrl[0] + '/collectType/deleteById' },
  // 收藏类别详情
  detailCollectType: { method: 'get', url: baseUrl[0] + '/collectType/detail' },
  // 用户收藏类别
  getCollectTypesByUid: { method: 'get', url: baseUrl[0] + '/collectType/findCollectTypesById' },
  /**
   * 密码管理
   */
  // 密码列表
  getPasswordList: { method: 'get', url: baseUrl[0] + '/password/list' },
  // 新增密码
  addPassword: { method: 'post', url: baseUrl[0] + '/password/add' },
  // 修改密码
  updatePassword: { method: 'put', url: baseUrl[0] + '/password/update' },
  // 删除密码
  deletePassword: { method: 'delete', url: baseUrl[0] + '/password/deleteById' },
  // 密码详情
  detailPassword: { method: 'get', url: baseUrl[0] + '/password/detail' },
  /**
   * 备忘录管理
   */
  // 备忘录列表
  GetMemeryList: { method: 'get', url: baseUrl[0] + '/memery/list' },
  // 新增备忘录
  AddMemery: { method: 'post', url: baseUrl[0] + '/memery/add' },
  // 修改备忘录
  UpdateMemery: { method: 'put', url: baseUrl[0] + '/memery/update' },
  // 删除备忘录
  DeleteMemery: { method: 'delete', url: baseUrl[0] + '/memery/deleteById' },
  // 备忘录详情
  DetailMemery: { method: 'get', url: baseUrl[0] + '/memery/detail' },
  /**
   * 账目管理
   */
  // 账目列表
  GetAccountList: { method: 'get', url: baseUrl[0] + '/account/list' },
  // 新增账目
  AddAccount: { method: 'post', url: baseUrl[0] + '/account/add' },
  // 修改账目
  UpdateAccount: { method: 'put', url: baseUrl[0] + '/account/update' },
  // 删除账目
  DeleteAccount: { method: 'delete', url: baseUrl[0] + '/account/deleteById' },
  // 账目详情
  DetailAccount: { method: 'get', url: baseUrl[0] + '/account/detail' },
  /**
   * 账目分类管理
   */
  // 账目分类列表
  GetAccountTagList: { method: 'get', url: baseUrl[0] + '/accountTag/list' },
  // 新增账目分类
  AddAccountTag: { method: 'post', url: baseUrl[0] + '/accountTag/add' },
  // 修改账目分类
  UpdateAccountTag: { method: 'put', url: baseUrl[0] + '/accountTag/update' },
  // 删除账目分类
  DeleteAccountTag: { method: 'delete', url: baseUrl[0] + '/accountTag/deleteById' },
  // 账目分类详情
  DetailAccountTag: { method: 'get', url: baseUrl[0] + '/accountTag/detail' },
  /**
   * 资源管理
   */
  // 资源列表
  GetResourceList: { method: 'get', url: baseUrl[0] + '/resource/list' },
  // 新增资源
  AddResource: { method: 'post', url: baseUrl[0] + '/resource/add' },
  // 移动资源
  MoveResource: { method: 'post', url: baseUrl[0] + '/resource/move' },
  // 复制资源
  CopyResource: { method: 'post', url: baseUrl[0] + '/resource/copy' },
  // 上传资源
  UploadResource: { method: 'post', url: baseUrl[0] + '/resource/upload' },
  // 修改资源
  UpdateResource: { method: 'put', url: baseUrl[0] + '/resource/update' },
  // 删除资源
  DeleteResource: { method: 'delete', url: baseUrl[0] + '/resource/delete' },
  // 资源详情
  DetailResource: { method: 'get', url: baseUrl[0] + '/resource/info' },
  // 资源下载
  DownloadResource: { method: 'get', url: baseUrl[0] + '/resource/download' },
  // 系统监控
  /**
   * 定时任务管理
   */
  // 定时任务列表
  GetTaskList: { method: 'get', url: baseUrl[0] + '/task/list' },
  // 新增定时任务
  AddTask: { method: 'post', url: baseUrl[0] + '/task/add' },
  // 修改定时任务
  UpdateTask: { method: 'put', url: baseUrl[0] + '/task/update' },
  // 删除定时任务
  DeleteTask: { method: 'delete', url: baseUrl[0] + '/task/deleteById' },
  // 定时任务详情
  DetailTask: { method: 'get', url: baseUrl[0] + '/task/detail' },
  // 定时任务日志
  TaskLog: { method: 'post', url: baseUrl[0] + '/task/log' },
  /**
   * 项目管理
   */
  // 项目列表
  GetProjectList: { method: 'get', url: baseUrl[0] + '/project/list' },
  // 新增项目
  AddProject: { method: 'post', url: baseUrl[0] + '/project/add' },
  // 修改项目
  UpdateProject: { method: 'put', url: baseUrl[0] + '/project/update' },
  // 删除项目
  DeleteProject: { method: 'delete', url: baseUrl[0] + '/project/deleteById' },
  // 项目详情
  DetailProject: { method: 'get', url: baseUrl[0] + '/project/detail' },
  // 项目下载
  DownloadProject: { method: 'get', url: baseUrl[0] + '/project/download' },
  /**
   * 项目图集管理
   */
  // 项目图集列表
  GetProjectImageList: { method: 'get', url: baseUrl[0] + '/projectImage/list' },
  // 新增项目图集
  AddProjectImage: { method: 'post', url: baseUrl[0] + '/projectImage/add' },
  // 修改项目图集
  UpdateProjectImage: { method: 'put', url: baseUrl[0] + '/projectImage/update' },
  // 删除项目图集
  DeleteProjectImage: { method: 'delete', url: baseUrl[0] + '/projectImage/deleteById' },
  // 项目图集详情
  DetailProjectImage: { method: 'get', url: baseUrl[0] + '/projectImage/detail' },
  /**
   * 项目文档管理
   */
  // 项目文档列表
  GetProjectDocumentList: { method: 'get', url: baseUrl[0] + '/projectDocument/list' },
  // 新增项目文档
  AddProjectDocument: { method: 'post', url: baseUrl[0] + '/projectDocument/add' },
  // 修改项目文档
  UpdateProjectDocument: { method: 'put', url: baseUrl[0] + '/projectDocument/update' },
  // 删除项目文档
  DeleteProjectDocument: { method: 'delete', url: baseUrl[0] + '/projectDocument/deleteById' },
  // 项目文档详情
  DetailProjectDocument: { method: 'get', url: baseUrl[0] + '/projectDocument/detail' },
  /**
   * 项目任务管理
   */
  // 项目任务列表
  GetProjectTaskList: { method: 'get', url: baseUrl[0] + '/projectTask/list' },
  // 新增项目任务
  AddProjectTask: { method: 'post', url: baseUrl[0] + '/projectTask/add' },
  // 修改项目任务
  UpdateProjectTask: { method: 'put', url: baseUrl[0] + '/projectTask/update' },
  // 删除项目任务
  DeleteProjectTask: { method: 'delete', url: baseUrl[0] + '/projectTask/deleteById' },
  // 项目详情任务
  DetailProjectTask: { method: 'get', url: baseUrl[0] + '/projectTask/detail' },
}


/**
 * name: 解构赋值出 method ， url
 * requireAuth: 请求接口是否需要授权，即是否需要传递 token
 * data: request payload参数   默认{}
 * params: query参数 如?user=jack&age=12   默认{}
 * paths: params参数 如/1/{name}  默认[] ,axios 没有封装 paths参数，需要自己处理
 * headers: headers 请求头 默认 application/json
 * 
 */
const API = (config) => {
  if (list[config.name] === undefined) {
    return Promise.reject(new Error(config.name + '不在list中'))
  }
  const { method, url } = list[config.name]
  const defaultConfig = {
    url,
    method: method.toUpperCase(),
    requireAuth: config.requireAuth ? config.requireAuth : false,
    data: config.data ? config.data : {},
    params: config.params ? config.params : {},
    paths: config.paths ? config.paths : [],
    headers: config.headers ? config.headers : {'Content-Type': 'application/json'}
  }
  // 处理 paths 数据，需要排除 paths 为 [] 的时候，否则无论传不传 paths，defaultConfig.paths 默认为 []
  if (defaultConfig.paths && defaultConfig.paths.constructor === Array) {
    if (defaultConfig.paths.length > 0) {
      defaultConfig.url += '/' + defaultConfig.paths.join('/') // 为 [] 时出来的结果都是 /，导致最后的 url 请求地址末尾多加了 /
    }
  } else {
    return Promise.reject(new Error('paths 数据类型错误'))
  }
  // 处理 params 数据（按情况而定才处理，后端接口如 /udisk/?page=1 就 需要处理）
  // if (Object.keys(defaultConfig.params).length !== 0) {
  //   defaultConfig.url += '/'
  // }
  return new Promise((resolve, reject) => {
    // 使用自定义的 axios 实例请求
    axios(defaultConfig).then(res =>  {
      resolve(res)
    }).catch(error => {
      reject(error)
    })
  })
}

// 拦截器
// 添加请求拦截器
axios.interceptors.request.use(req => {
  // 在发送请求之前做什么
  if (req.requireAuth) {
    if (req.headers) {
      // 还要判断前端 token 是否存在
      // 设置 authorization 的值为用户登录成功后返回的 token  js-cookies
      req.headers.Authorization = Cookies.get('token')
    }
  }
  return req
}, error => {
  // 对请求错误做什么
  return Promise.reject(error)
})


// 添加响应拦截器
axios.interceptors.response.use(res => {
  // 对响应数据做什么
  // 处理下载文件的接口
  if (res.config.headers['Content-Type'] === 'application/octet-stream') {
    return res
  }
  if (res.data.code) {
    return Promise.resolve(res)
  } else {
    return Promise.reject(res)
  }
}, error => {
  // 对响应错误做什么
  // if (error.response.status) {
  //   switch (error.response.status) {
  //     case 401:
  //       // 清除 token，未授权错误信息提示，跳转到登录页面
  //       message({ type: 'error', message: '未授权' })
  //       router.replace({
  //         path: '/login',
  //         // 登录成功后跳回浏览的当前页面
  //         query: { redirect: router.currentRoute.fullPath }
  //       })
  //       break
  //     case 500:
  //       // 服务器错误信息提示
  //       message({ type: 'error', message: '服务器错误' })
  //       break
  //     case 404:
  //       // 请求路径错误信息提示
  //       message({ type: 'error', message: '请求路径错误' })
  //       break
  //   }
  // }
  return Promise.reject(error)
})


export default API